package models

import (
	"gorm.io/gorm"
	"time"
)

type MqttClient struct {
	Host         string `json:"host"`                    // 主机
	Port         int    `json:"port"`                    // 端口
	ClientId     string `json:"client_id"`               // 客户端id
	Username     string `json:"username"`                // 账号
	Password     string `json:"password"`                // 密码
	Subtopic     string `json:"subtopic"`                // 订阅的主题
	Start        bool   `json:"start"`                   // 是否启动
	LastPushTime string `json:"last_push_time" gorm:"-"` // 最后推送时间
	Script       string `json:"script" gorm:"type:text"` // 数据处理脚本
	gorm.Model   `structs:"-"`
}

type Signal struct {
	Protocol   string `json:"protocol"` // 协议
	IdentificationCode string `json:"identification_code"` // 设备标识码
	DeviceUid int    `json:"device_uid"`                                        // 联网设备ID
	Name           string `json:"name"`                            // 信号的名称，用于标识不同的信号
	Alias          string `json:"alias" structs:"alias"`           // 信号的别名，用于显示
	Type           string `json:"type"`                            // 信号的数据类型，如整数、字符串等
	MqttClientName string `gorm:"-" json:"mqtt_client_name"`       // MQTT客户端的名称，不存储在数据库中
	Unit           string `json:"unit" structs:"unit"`             // 单位
	CacheSize      int    `json:"cache_size" structs:"cache_size"` // 缓存大小
	gorm.Model     `structs:"-"`
}
type SignalWaringConfig struct {
	SignalId     int     `gorm:"signal_id"  json:"signal_id" structs:"signal_id"` // 信号表的外键ID
	Min          float64 `gorm:"min"  json:"min" structs:"min"`                   // 范围,小值
	Max          float64 `gorm:"max"  json:"max" structs:"max"`                   // 范围,大值
	InOrOut      int     `gorm:"in_or_out"  json:"in_or_out" structs:"in_or_out"` //范围内报警,范围外报警 1 范围内报警 0 范围外报警
	Protocol   string `json:"protocol" structs:"protocol"`
	IdentificationCode string `json:"identification_code" structs:"identification_code"` // 设备标识码
	DeviceUid int    `json:"device_uid" structs:"device_uid"`                                        // MQTT客户端表的外键ID
	gorm.Model   `structs:"-"`
	Signal       Signal `gorm:"-" json:"signal" structs:"-"`
}

// SignalDelayWaring : 允许信号数据做一定条数的暂存
type SignalDelayWaring struct {
	Name       string `json:"name" structs:"name"`     // 名称
	Script     string `json:"script" gorm:"type:text"` // 数据处理脚本
	gorm.Model `structs:"-"`
}

type SignalDelayWaringParam struct {
	MqttClientName      string `gorm:"-" json:"mqtt_client_name"`                             // MQTT客户端的名称，不存储在数据库中
	Protocol   string `json:"protocol" structs:"protocol"`

	IdentificationCode string `json:"identification_code" structs:"identification_code"` // 设备标识码

	DeviceUid int    `json:"device_uid" structs:"device_uid"`                                        // MQTT客户端表的外键ID

	Name                string `json:"name"`                                                  // 参数名称
	SignalName          string `gorm:"signal_name"  json:"signal_name" structs:"signal_name"` // 信号表 name
	SignalId            int    `gorm:"signal_id"  json:"signal_id" structs:"signal_id"`       // 信号表的外键ID
	SignalDelayWaringId int    `json:"signal_delay_waring_id"`                                // SignalDelayWaring 主键
	gorm.Model          `structs:"-"`
}

type NodeInfo struct {
	Host string `json:"host,omitempty" yaml:"host,omitempty"`
	Port int    `json:"port,omitempty" yaml:"port,omitempty"`
	Name string `json:"name,omitempty" yaml:"name,omitempty"`
	Type string `json:"type,omitempty" yaml:"type,omitempty"`
	Size int64  `json:"size,omitempty" yaml:"size,omitempty"` // 最大处理数量
}

// CalcRule 计算规则
type CalcRule struct {
	Name       string `json:"name" structs:"name"`                              // 任务名称
	Cron       string `json:"cron"`                                             // 定时任务执行周期
	Script     string `json:"script" gorm:"type:text"`                          // 数据处理脚本
	Offset     int64  `json:"offset" structs:"offset"`                          // 执行时间往前推移几秒
	Start      bool   `json:"start" structs:"start"`                            // 是否启动
	MockValue  string `json:"mock_value" structs:"mock_value" gorm:"type:text"` // 模拟数据
	gorm.Model `structs:"-"`
}

// CalcParam 计算参数
type CalcParam struct {
	Protocol   string `json:"protocol"`
	IdentificationCode string `json:"identification_code"` // 设备标识码
	DeviceUid int    `json:"device_uid"`                                        // MQTT客户端表的外键ID
	Name           string `json:"name"`                                                  // 参数名称
	SignalId       int    `gorm:"signal_id"  json:"signal_id" structs:"signal_id"`       // 信号表的外键ID
	Reduce         string `json:"reduce"`                                                // 数据聚合方式 1. mean 2. sum 3.
	// max 4. min 5. 原始
	CalcRuleId     int    `json:"calc_rule_id"`                                          // CalcRule 主键
	MqttClientName string `gorm:"-" json:"mqtt_client_name"`                             // MQTT客户端的名称，不存储在数据库中
	gorm.Model     `structs:"-"`
}

// Dashboard 可视化板
type Dashboard struct {
	Name       string `json:"name"`                    // 名称
	Config     string `json:"config" gorm:"type:text"` // 配置
	gorm.Model `structs:"-"`
}

// Product 产品
type Product struct {
	Name           string  `json:"name"`                                      // 产品名称
	Description    string  `json:"description" structs:"description"`         // 产品描述
	SKU            string  `json:"sku" structs:"sku"`                         // 库存单位
	Price          float64 `json:"price" structs:"price"`                     // 销售价格
	Cost           float64 `json:"cost" structs:"cost"`                       // 成本
	Quantity       int     `json:"quantity" structs:"quantity"`               // 库存数量
	MinimumStock   int     `json:"minimum_stock" structs:"minimum_stock"`     // 最低库存量
	WarrantyPeriod int     `json:"warranty_period" structs:"warranty_period"` // 质保时间（天）
	Status         string  `json:"status" structs:"status"`                   // 产品状态
	Tags           string  `json:"tags" structs:"tags"`                       // 标签
	ImageURL       string  `json:"image_url" structs:"image_url"`             // 图片URL
	gorm.Model     `structs:"-"`
}

// DeviceInfo 设备信息
type DeviceInfo struct {
	ProductId         uint      `json:"product_id" structs:"product_id"`                                                                     // 产品ID
	SN                string    `json:"sn" structs:"sn"`                                                                                     // 设备编号
	ManufacturingDate time.Time `json:"manufacturing_date,omitempty" gorm:"type:DATETIME; default:NULL;" structs:"manufacturing_date"`       // 制造日期
	ProcurementDate   time.Time `json:"procurement_date,omitempty" gorm:"type:DATETIME; default:NULL;" structs:"procurement_date,omitempty"` // 采购日期
	Source            int       `json:"source" structs:"source"`                                                                             // 设备来源,1: 内部,2: 外源
	WarrantyExpiry    time.Time `json:"warranty_expiry,omitempty" gorm:"type:DATETIME; default:NULL;" structs:"warranty_expiry"`             // 保修截止日期
	PushInterval      int       `json:"push_interval,omitempty" structs:"push_interval"`                                                     // 推送间隔（秒）
	ErrorRate         float64   `json:"error_rate,omitempty" structs:"error_rate"`                                                           // 推送时间误差（秒）
	Protocol          string    `json:"protocol,omitempty" structs:"protocol,omitempty"`                                                                         // 协议
	gorm.Model        `structs:"-"`
}

func (d *DeviceInfo) BeforeSave(tx *gorm.DB) (err error) {
	if d.ProcurementDate.IsZero() {
		gorm.Expr("NULL")
	}
	return
}

// DeviceGroup 设备组
type DeviceGroup struct {
	Name       string `json:"name" structs:"name"` // 名称
	gorm.Model `structs:"-"`
}

// DeviceGroupDevice 设备组与设备信息的关联表
type DeviceGroupDevice struct {
	DeviceInfoId       uint `json:"device_info_id" structs:"device_info_id" gorm:"column:device_info_id;"`   // 设备表的外键ID
	DeviceGroupGroupId uint `json:"device_group_id" structs:"device_group_id" gorm:"column:device_group_id;"` // 设备组表的外键ID
	gorm.Model         `structs:"-"`
}

// DeviceInstallRecord 设备安装记录
type DeviceInstallRecord struct {
	gorm.Model         `structs:"-"`
	DeviceGroupGroupId uint      `json:"device_group_id" structs:"device_group_id"` // 设备组表的外键ID
	DeviceInfoId       uint      `json:"device_info_id" structs:"device_info_id"`   // 设备表的外键ID
	InstallDate        time.Time `json:"install_date" structs:"install_date"`       // 安装日期
	Technician         string    `json:"technician" structs:"technician"`           // 安装人员
	Description        string    `json:"description" structs:"description"`         // 安装描述
	PhotoURL           string    `json:"photo_url" structs:"photo_url"`             // 照片URL
}

// RepairRecord 维修记录
type RepairRecord struct {
	DeviceGroupGroupId uint      `json:"device_group_id" structs:"device_group_id"` // 设备组表的外键ID
	DeviceInfoId       uint      `json:"device_info_id" structs:"device_info_id"`   // 设备表的外键ID
	RepairDate         time.Time `json:"repair_date" structs:"repair_date"`         // 维修日期
	Technician         string    `json:"technician" structs:"technician"`           // 维修人员
	Cost               float64   `json:"cost" structs:"cost"`                       // 维修成本
	Description        string    `json:"description" structs:"description"`         // 维修描述
	gorm.Model         `structs:"-"`
}

// ShipmentRecord 发货记录
type ShipmentRecord struct {
	gorm.Model      `structs:"-"`
	ShipmentDate    time.Time `json:"shipment_date" structs:"shipment_date"`       // 发货日期
	Technician      string    `json:"technician" structs:"technician"`             // 发货人员
	CustomerName    string    `json:"customer_name" structs:"customer_name"`       // 客户名称
	CustomerPhone   string    `json:"customer_phone" structs:"customer_phone"`     // 客户手机
	CustomerAddress string    `json:"customer_address" structs:"customer_address"` // 客户地址
	TrackingNumber  string    `json:"tracking_number" structs:"tracking_number"`   // 跟踪号码
	Status          string    `json:"status" structs:"status"`                     // 发货状态（例如：pending, shipped, delivered）
	Description     string    `json:"description" structs:"description"`           // 发货描述
}

// ShipmentProductDetail 发货记录中的具体产品
type ShipmentProductDetail struct {
	gorm.Model       `structs:"-"`
	ShipmentRecordId uint `json:"shipment_record_id" structs:"shipment_record_id"` // 发货记录ID
	ProductID        uint `json:"product_id" structs:"product_id"`                 // 关联的产品ID
	DeviceInfoId     uint `json:"device_info_id" structs:"device_info_id"`         // 设备表的外键ID
	Quantity         int  `json:"quantity" structs:"quantity"`                     // 发货数量
}

// ProductionPlan 表示生产计划
type ProductionPlan struct {
	gorm.Model  `structs:"-"`
	Name        string    `json:"name" structs:"name"`               // 生产计划名称
	StartDate   time.Time `json:"start_date" structs:"start_date"`   // 生产计划开始日期
	EndDate     time.Time `json:"end_date" structs:"end_date"`       // 生产计划结束日期
	Description string    `json:"description" structs:"description"` // 生产计划描述
	Status      string    `json:"status" structs:"status"`           // 计划状态（1准备中,2进行中, 3已完成）
}

// ProductPlan 表示生产计划中的具体产品计划
type ProductPlan struct {
	gorm.Model       `structs:"-"`
	ProductionPlanID uint `json:"production_plan_id" structs:"production_plan_id"` // 关联的生产计划ID
	ProductID        uint `json:"product_id" structs:"product_id"`                 // 关联的产品ID
	Quantity         int  `json:"quantity" structs:"quantity"`                     // 计划生产数量
}

type User struct {
	gorm.Model `structs:"-"`
	Username   string `json:"username" structs:"username"` // 用户名
	Password   string `json:"password" structs:"password"` // 密码
	Email      string `json:"email" structs:"email"`       // 电子邮箱
	Status     string `json:"status" structs:"status"`     // 用户状态（例如：active, inactive）
}

type Role struct {
	gorm.Model  `structs:"-"`
	Name        string `json:"name" structs:"name"`               // 角色名
	Description string `json:"description" structs:"description"` // 角色描述
	CanDel      bool   `json:"can_del" structs:"can_del"`         // 是否可以删除
}

type UserDept struct {
	gorm.Model `structs:"-"`
	UserId     uint `json:"user_id" structs:"user_id"` // 用户ID
	DeptId     uint `json:"dept_id" structs:"dept_id"` // 部门ID

}

type UserRole struct {
	gorm.Model `structs:"-"`
	UserId     uint `json:"user_id" structs:"user_id"` // 用户ID
	RoleId     uint `json:"role_id" structs:"role_id"` // 角色ID
}
type Dept struct {
	gorm.Model `structs:"-"`
	Name       string `json:"name" structs:"name"`                                  // 部门名
	ParentId   uint   `json:"parent_id,omitempty" structs:"parent_id"`              // 父部门ID
	ParentName string `json:"parent_name,omitempty" gorm:"-" structs:"parent_name"` // 父部门名称
}

type UserBindDeviceInfo struct {
	gorm.Model `structs:"-"`
	UserId     uint `json:"user_id" structs:"user_id"`     // 用户ID
	DeviceId   uint `json:"device_id" structs:"device_id"` // 设备ID
}

type DeviceBindMqttClient struct {
	gorm.Model         `structs:"-"`
	DeviceInfoId       uint   `json:"device_info_id" structs:"device_info_id"`           // 设备ID
	MqttClientId       uint   `json:"mqtt_client_id" structs:"mqtt_client_id"`           // MQTT客户端表的外键ID
	IdentificationCode string `json:"identification_code" structs:"identification_code"` // 设备标识码
}

type DeviceBindTcpHandler struct {
	gorm.Model         `structs:"-"`
	DeviceInfoId       uint   `json:"device_info_id" structs:"device_info_id"`           // 设备ID
	TcpHandlerId       uint   `json:"tcp_handler_id" structs:"tcp_handler_id"`           // TCP处理器的ID
	IdentificationCode string `json:"identification_code" structs:"identification_code"` // 设备标识码

}

// TcpHandler 表示TCP数据处理器
type TcpHandler struct {
	gorm.Model `structs:"-"`
	DeviceInfoId       uint   `json:"device_info_id" structs:"device_info_id"`           // 设备ID
	Username     string `json:"username" structs:"username"`             // 用户名
	Password     string `json:"password" structs:"password"`             // 密码
	Name       string `json:"name" structs:"name"`     // 处理器名
	Script     string `json:"script" structs:"script"` // 处理器脚本
}

type HttpHandler struct {
	DeviceInfoId uint   `json:"device_info_id" structs:"device_info_id"` // 设备ID
	Name         string `json:"name" structs:"name"`                     // 处理器名
	Username     string `json:"username" structs:"username"`             // 用户名
	Password     string `json:"password" structs:"password"`             // 密码
	Script       string `json:"script" structs:"script"`                 // 脚本
	gorm.Model   `structs:"-"`
}

type CoapHandler struct {
	DeviceInfoId uint   `json:"device_info_id" structs:"device_info_id"` // 设备ID
	Name         string `json:"name" structs:"name"`                     // 处理器名
	Username     string `json:"username" structs:"username"`             // 用户名
	Password     string `json:"password" structs:"password"`             // 密码
	Script       string `json:"script" structs:"script"`                 // 脚本
	gorm.Model   `structs:"-"`
}

type WebsocketHandler struct {
	DeviceInfoId uint   `json:"device_info_id" structs:"device_info_id"` // 设备ID
	Name         string `json:"name" structs:"name"`                     // 处理器名
	Username     string `json:"username" structs:"username"`             // 用户名
	Password     string `json:"password" structs:"password"`             // 密码
	Script       string `json:"script" structs:"script"`                 // 脚本
	gorm.Model   `structs:"-"`
}

type DeviceGroupBindMqttClient struct {
	gorm.Model    `structs:"-"`
	DeviceGroupId uint `json:"device_group_id" structs:"device_group_id"` // 设备组ID
	MqttClientId  uint `json:"mqtt_client_id" structs:"mqtt_client_id"`   // MQTT客户端表的外键ID
}

type MessageTypeBindRole struct {
	gorm.Model  `structs:"-"`
	MessageType int  `json:"message_type" structs:"message_type"` // 消息类型
	RoleId      uint `json:"role_id" structs:"role_id"`           // 角色ID
}

type MessageList struct {
	gorm.Model    `structs:"-"`
	Content       string `json:"content" structs:"content"`                 // 消息内容
	EnContent     string `json:"en_content" structs:"en_content"`           // 消息内容(英文)
	MessageTypeId int    `json:"message_type_id" structs:"message_type_id"` // 消息类型ID
	RefId         string `json:"ref_id" structs:"ref_id"`                   // 关联的ID
}

// SimCard 表示物联网卡的数据模型
type SimCard struct {
	gorm.Model   `structs:"-"`
	AccessNumber string    `gorm:"column:access_number;type:varchar(20);not null" json:"access_number" structs:"access_number"` //物联网卡的接入号
	ICCID        string    `gorm:"column:iccid;type:varchar(20);not null" json:"iccid" structs:"iccid"`                         // 物联网卡的集成电路卡识别码，唯一标识
	IMSI         string    `gorm:"column:imsi;type:varchar(15);not null" json:"imsi" structs:"imsi"`                            // 物联网卡的国际移动用户识别码，唯一标识
	Operator     string    `gorm:"column:operator;type:varchar(50);not null" json:"operator" structs:"operator"`                //物联网卡的运营商名称
	Expiration   time.Time `gorm:"column:expiration;type:datetime;not null" json:"expiration" structs:"expiration"`             // 物联网卡的到期时间
}

// SimUseHistory 表示物联网卡的使用历史记录
type SimUseHistory struct {
	gorm.Model   `structs:"-"`
	SimId        uint   `json:"sim_id" structs:"sim_id"`                 // 物联网卡ID
	DeviceInfoId uint   `json:"device_info_id" structs:"device_info_id"` // 设备ID
	Description  string `json:"description" structs:"description"`       // 描述
}
